﻿#ifndef DATAANALYZER_H
#define DATAANALYZER_H

#include <QMainWindow>
#include <QDebug>
#include <cglobals.h>
#include <QLabel>
#include <target.h>
#include <configsetting.h>
#include <protocolprocess.h>
#include <udpmsgprocess.h>
#include <QHostAddress>
#include <dataprocess.h>
#include <logprocess.h>
#include <optionsdialog.h>
#include <getcommons.h>
#include <QFrame>
#include <QPushButton>
#include <QAction>
#include <QGroupBox>
#include <QLineEdit>
#include <QComboBox>
#include <QSlider>
#include <QColorDialog>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QResizeEvent>
#include <QGridLayout>
#include <rulerwidget.h>
#include <maindrawwidget.h>
#include <legendlabel.h>
#include <QScrollBar>
#include <QColor>
#include <mywidget.h>
#include <curveconfigprocess.h>
#include <dialogdeviceselect.h>
#include <QEvent>
#include "mytextbrowser.h"


//#pragma execution_character_set("UTF-8")


QT_BEGIN_NAMESPACE
namespace Ui { class DataAnalyzer; }
QT_END_NAMESPACE

class DataAnalyzer : public QMainWindow
{
    Q_OBJECT

public:
    DataAnalyzer(QWidget *parent = nullptr);
    ~DataAnalyzer();
    // 显示模块
    void initMainWindowSetting();                                                                   // 主窗口设置
    void resizeWindowGeometry(int width, int height);                                               // 重置窗口大小
    void resetWinddowBackgroundColor();                                                             // 重置窗口背景色

    void setDigitalAreaGeometry(int width, int height);                                             // 设置数字显示区域尺寸
    void initDigitalArea();                                                                         // 初始化数字显示区域
    void resizeDigitalAreaGeometry(int width, int height);                                          // 重置数字显示区域尺寸

    void setImageAreaGeometry(int width, int height);                                               // 设置图形显示区域尺寸
    void initImageArea();                                                                           // 初始化图形显示区域
    void resetImageAreaGeometry();                                                                  // 重置图形区域尺寸
    void resetImageAreaBackgroundColor();                                                           // 重置图形区域背景色

    void setLegendAreaGeometry(int width, int height);                                              // 设置图例区域尺寸
    void initLegendArea();                                                                          // 初始化图例区域
    void resetLegendAreaGeometry();                                                                 // 重置图例区域尺寸
    void resetLegendAreaBackgroundColor();                                                          // 重置图例区域背景色
    void updateLegendArea();                                                                       // 在图里区域添加标签

    void initDrawArea();                                                                            // 绘图区域
    void resetDrawArea();                                                                           // 重置绘图区域尺寸
    void initRulerArea();                                                                           // 标尺区域
    void resetRulerArea();                                                                          // 重置标尺区域尺寸

    void setControlAreaGeometry(int width, int height);                                             // 设置控制区域尺寸
    void initControlArea();                                                                         // 初始化控制区域
    void resizeControlAreaGeometry(int width, int height);                                          // 重置控制区域尺寸

    void initOptionsDialog();                                                                       // 初始化配置选项窗口
    void initCommonParameters();                                                                    // 初始化参数


    void initToolBar();                                                                             // 工具栏设置
    void resetToolBarGeometry(int width);                                                           // 重置工具栏尺寸
    void resetToolbarBackgroundColor();                                                             // 重置工具栏背景色
    void updateToolBar(QString cycleNumber, QString cycleTime);                                     // 更新工具栏信息

    void initDisplayValueArea();                                                                    // 初始化显示当前值区域
    void initCurveModifyArea();                                                                     // 初始化变量增删改区域
    void initZoomArea();                                                                            // 初始化坐标缩放区域
    void initXZoomArea();                                                                           // 初始化横坐标缩放
    void initYZoomArea();                                                                           // 初始化纵坐标缩放
    void initCycleArea();                                                                           // 初始化周期播放组控件
    void initPageAndLogoArea();                                                                     // 初始化翻页和Logo区域
    void initPageArea();                                                                            // 初始化翻页组控件
    void initLogoArea();                                                                            // 初始化Logo标签
    void hideWidget();                                                                              // 隐藏控件
    void showWidget();                                                                              // 显示控件
    void updateTextbrowser();

    void addAllCurvesToComboBoxCurveAdd();                                                          // 添加所有曲线至曲线添加选择下拉框
    void setComboBoxMinWidth(QComboBox* pComboBox, int width);                                      // 设置曲线选择相关下拉框最小宽度


    void resizeLabelsGeometry();                                                                    // 重置标签尺寸
    void resetLabelFont();                                                                          // 重置数字显示区域标签字体
    void resetLabelColor();                                                                         // 重置数字显示区域标签颜色
    void clearLabelsArray();                                                                        // 清空显示标签

    void getCurrentPageDataFromLogFile();                                                           // 从日志文件获取当前页数据
    void createPageLabel();                                                                         // 创建页面标签
    void showCurrentPage();                                                                         // 显示当前页数据

    void getCurrentPageDataFromPauseData();                                                         // 从暂停数据中获取当前页数据

    void initDeviceProcessModule();                                                                 // 设备处理模块初始化
    void initProtocolProcessModule();                                                               // 协议处理模块初始化
    void initUdpMsgProcessModule();                                                                 // UDP接口模块初始化
    void initDataProcessModule();                                                                   // 数据处理模块初始化
    void initLogProcessModule();                                                                    // 日志处理模块初始化
    void initCurveConfigProcessModule();                                                            // 曲线配置处理模块初始化
    void initUDPGroup();

    void setPageButtonsStatus();                                                                    // 设置翻页按钮状态
    void setCycleButtonsStatus();                                                                   // 设置周期按钮状态

    void clearLogReadData();                                                                        // 清空日志读取时的相关数据
    void clearUdpReceieData();                                                                      // 清空UDP接收数据时的相关数据

    void resetValueStatus();                                                                        // 重置变量值

signals:
    void stopReceive();

public slots:
    void actionDeviceSelectSlot();                                                                  // 设备选择按钮响应函数
    void actionOptionsSlot();                                                                       // 配置选项按钮响应函数
    void actionQuitSlot();                                                                          // 退出按钮响应函数
    void actionReceiveMessageSlot();                                                                // 获取数据按钮响应函数
    void actionPauseSlot();                                                                         // 暂停按钮响应函数
    void actionStopAndSaveSlot();                                                                   // 停止并保存按钮响应函数
    void actionOpenLogSlot();                                                                       // 打开日志按钮响应函数
    void actionStopPlaySlot();                                                                      // 停止播放按钮响应函数
    void actionReplaySlot();                                                                        // 重放按钮响应函数
    void actionDigitalDisplaySlot();                                                                // 数字显示按钮响应函数
    void actionImageDisplaySlot();                                                                  // 图形显示按钮响应函数
    void actionImportConfigSlog();                                                                  // 导入自定义配置文件
    void actionExportConfigSlot();                                                                  // 导出自定义配置文件
    void actionBatchReceiveSlot();                                                                  // 批量获取日志
    void actionStopBatchSlot();                                                                     // 停止批量获取
    void actionLogCapture();                                                                        // 日志截取
    void actionODMSTransfer();                                                                      // ODMS日志转换
    void curveAddButtonSlot();                                                                      // 曲线添加按钮响应函数
    void curveDelButtonSlot();                                                                      // 曲线删除按钮响应函数
    void curveDelComboBoxIndexChangedSlot();                                                        // 曲线删除下拉框内容变更响应函数
    void curveChangeColorButtonSlot();                                                              // 曲线改色按钮响应函数
    void curveXRangeChangedSlot();                                                                  // 曲线X轴修改响应函数
    void zoominButtonSlot();                                                                        // 放大按钮响应函数
    void zoomoutButtonSlot();                                                                       // 缩小按钮响应函数
    void rangeChangeButtonSlot();                                                                   // 取值范围确认按钮响应函数
    void multipleBackwardButtonSlot();                                                              // 快退按钮响应函数
    void backwardButtonSlot();                                                                      // 后退按钮响应函数
    void forwardButtonSlot();                                                                       // 前进按钮响应函数
    void multipleForwardButtonSlot();                                                               // 快进按钮响应函数
    void homepageButtonSlot();                                                                      // 首页按钮响应函数
    void pageupButtonSlot();                                                                        // 上翻按钮响应函数
    void lineeditEnterSlot();                                                                       // 输入页码后回车响应函数
    void pagedownButtonSlot();                                                                      // 下翻按钮响应函数
    void endpageButtonSlot();                                                                       // 尾页按钮响应函数
    void cycleSliderSlot();                                                                         // 周期滑块响应函数
    void updateCurrentPageSlot(QString cycleNumber = "", QString cycleTime = "", pPAGE_CONTEXT pPageData = NULL);    // 更新当前页数据

private:
    inline void cycleChange(int step);
    inline void pageChange(uint page);
    inline void labelMouseDoubleClicked(QLabel* titleLabel);                                        // 通过在数字界面双击label添加曲线
    inline void updateFromLogOrPauseData();                                                         // 根据日志或者暂停数据更新数据



protected:
    void resizeEvent(QResizeEvent* size);                                                           // 重写窗口尺寸改变事件响应
    void wheelEvent(QWheelEvent *event);
    virtual bool eventFilter(QObject* obj, QEvent* event) override;



private:
    Ui::DataAnalyzer *ui;

    // 配置选项窗口中对应值
    //配置选项窗口
    OptionsDialog* pOptionsDialog = NULL;                                                           // 配置窗口
    pOPTIONS pOptions = NULL;                                                                       // 配置选项结构体
    pCOMMONS pCommonParameters = NULL;                                                              // 参数结构体
    int* pShowMode = NULL;                                                                          // 显示模式
    int* pDataSource = NULL;                                                                        // 数据来源

    // 工具栏
    QAction* pActionDigitalDisplay;                                                                 // 数字显示按钮
    QAction* pActionImageDisplay;                                                                   // 图形显示按钮
    QLabel* pLabelCycleTitle;
    QLabel* pLabelCycleNumber;
    QLabel* pLabelTimeStamp;
    QLabel* pToolBarSpaceSeprator1;
    QLabel* pToolBarSpaceSeprator2;

    //显示模块
    // 主窗口相关属性
    QWidget* pDigitalArea = NULL;                                                                   // 数字显示区域
    QHBoxLayout* pDigitalAreaLayout = NULL;                                                         // 数字显示区域布局
    QWidget* pImageArea = NULL;                                                                     // 图形显示区域
    QWidget* pDrawArea = NULL;                                                                      // 绘图区域
    QWidget* pControlArea = NULL;                                                                   // 控制区域属性
    QHBoxLayout* pControlAreaLayout = NULL;                                                         // 控制区域布局
    QWidget* pLegendArea = NULL;                                                                    // 图例区域
    QHBoxLayout* pLegendAreaLayout = NULL;
    QWidget* pLabelArea = NULL;                                                                     // 用于显示标题和值的标签

    // 数字界面相关属性
    int* pDigitalArea_Width = NULL;                                                                 // 数字区域宽度
    int* pDigitalArea_Height = NULL;                                                                // 数字区域高度
    QWidget** pLabelsWidgetArray = NULL;                                                            // 放置标签的控件数组
//    QVBoxLayout* pLabelColLayout = NULL;
    QVector<QLabel*>* pPageLabelsArray = NULL;                                                      // 页面显示内容的标签数组
    pPAGE_AREA_ATTR pPageAreaAttr = NULL;                                                           // 页码相关设置
    pCYCLE_ATTR pCycleAttr = NULL;                                                                  // 周期相关属性
    pPAGE_CONTEXT pCurrentPageData = NULL;                                                          // 当前页数据

    // 图形界面相关属性
    int* pImageArea_Width = NULL;                                                                   // 数字区域宽度
    int* pImageArea_Height = NULL;                                                                  // 数字区域高度
    int* pLegendArea_Width = NULL;                                                                  // 图例区域宽度
    int* pLegendArea_Height = NULL;                                                                 // 图例区域高度
    RulerWidget* pRulerWidget = NULL;                                                               // 标尺区域
    MainDrawWidget* pDrawWidget = NULL;                                                             // 绘图控件

    // 控制区域相关属性
    MyTextBrowser* pWidgetDisplayValue = NULL;                                                            // 显示当前周期值区域
    QWidget* pWidgetCurveModify = NULL;                                                             // 曲线增删改区域
    QWidget* pWidgetZoomArea = NULL;                                                                // 缩放控件区域
    QWidget* pWidgetCycle = NULL;                                                                   // 周期相关区域
    QWidget* pWidgetPageAndLogo = NULL;                                                             // 翻页和Logo区域
    QVBoxLayout* pWidgetZoomAreaLayout = NULL;                                                      // 缩放控件区域布局
    QVBoxLayout* pPageAndLogoLayout = NULL;                                                         // 翻页和Logo区域布局
    QFrame* pTextBrowserDisplayValue = NULL;                                                        // 当前周期值显示区域（在数字界面不显示）
    QGroupBox* pGroupBoxCurveSelection = NULL;                                                      // 曲线选择组控件
    QComboBox* pComboBoxCurveAdd = NULL;                                                            // 添加曲线下拉框
    QPushButton* pButtonCurveAdd = NULL;                                                            // 添加曲线按钮
    QComboBox* pComboBoxCurveDel = NULL;                                                            // 删除曲线下拉框
    QPushButton* pButtonCurveDel = NULL;                                                            // 删除曲线按钮
    QPushButton* pButtonCurveChangeColor = NULL;                                                    // 修改颜色按钮
    QGroupBox* pGroupBoxXZoom = NULL;                                                               // X轴缩放组控件
    QComboBox* pComboBoxXZoom = NULL;                                                               // X轴缩放下拉框
    QPushButton* pButtonXZoomOut = NULL;                                                            // X轴缩小按钮
    QPushButton* pButtonXZoomIn = NULL;                                                             // X轴放大按钮
    QGroupBox* pGroupBoxYZoom = NULL;                                                               // Y轴缩放组控件
    QLineEdit* pLineEditMin = NULL;                                                                 // 最小值编辑框
    QLineEdit* pLineEditMax = NULL;                                                                 // 最大值编辑框
    QGroupBox* pGroupBoxCycle = NULL;                                                               // 周期播放组控件
    QPushButton* pButtonConfirm = NULL;                                                             // 确认按钮
    QPushButton* pButtonMultipleBackard = NULL;                                                     // 快退
    QPushButton* pButtonBackward = NULL;                                                            // 单周期回退
    QPushButton* pButtonForward = NULL;                                                             // 单周期播放
    QPushButton* pButtonMultipleForward = NULL;                                                     // 快进
    QSlider* pCycleSlider = NULL;                                                                   // 周期滑块
    QGroupBox* pGroupBoxPage = NULL;                                                                // 翻页播放组控件
    QPushButton* pButtonHomePage = NULL;                                                            // 首页
    QPushButton* pButtonPageUp = NULL;                                                              // 上一页
    QLineEdit* pLineEnditPage = NULL;                                                               // 页码显示
    QPushButton* pButtonPageDown = NULL;                                                            // 下一页
    QPushButton* pButtonEndPage = NULL;                                                             // 尾页
    QScrollBar* pTextScrollBar = NULL;
    QScrollBar* pLegendScrollBar = NULL;
    int* pScale = NULL;                                                                             // 周期范围
    int tb_slider_pos;


    int* pControlArea_Width = NULL;                                                                 // 数字区域宽度
    int* pControlArea_Height = NULL;                                                                // 数字区域高度

    DeviceProcess* pDeviceProcessModule = NULL;                                                     // 设备处理模块
    ProtocolProcess* pProtocolProcessModule = NULL;                                                 // 协议处理模块
    UdpMsgProcess* pUdpMsgProcessModule = NULL;                                                     // UDP通信接口模块
    DataProcess* pDataProcessModule = NULL;                                                         // 数据处理模块
    LogProcess* pLogProcessModule = NULL;                                                           // 日志处理模块
    CurveConfigProcess* pCurveConfigProcessModule = NULL;                                           // 曲线配置处理模块
    QVector<UdpMsgProcess*>* pUdpGroup = NULL;
    QThread* pUdpThread;
    QString sys;
    bool udpStartFlag = true;
    bool pageChangeFlag = false;
    bool pauseFlag = false;
    QString mWindowTitle;

    QString mODMSLogLastPath;

};




#endif // DATAANALYZER_H
